<template>
    <el-select
        v-model="model"
        :placeholder="$t('common.pla.pleaseSelect')"
        filterable
        clearable
        @change="handleChange"
        style="width: 100%;"
        :disabled="disabled"
    >
        <el-option
            v-for="item in courseLabelList"
            :key="item.value"
            :label="item.label"
            :value="item.value"
        />
    </el-select>
</template>
<script>

import { getCoursesLabelList } from "common/src/api/culture/bachelor.js";

/**
 * 课程性质下拉框组件，基于id筛选
 * TODO: 之后将逐步淘汰该组件使用
 */
export default {
    name: "CourseLAbelSelect",
    model: {
        prop: "model",
        event: "change"
    },
    props: {
        model: {
            default: null,
            validator: function(value) {
                // v-model不能为null
                const valide = value !== null && value !== undefined;
                if (!valide) {
                    console.warn("v-model不能为null");
                }
                return valide;
            }
        }, // 父组件通过v-model传过来, 如果传来的值为null为出现 Cannot read property 'some' of null
        value: null,
        placeholder: {
            type: String,
            default: ""
        },
        include:{ // 包含的code 展示在这里 null 则展示全部，即在include又在exclude 以include为准
          type: Array
        },
        exclude:{ // 排除的code
          type: Array
        },
        excludeLabel: { // 根据名称需要排除的数据项, excludeLabel和exclude取并集
          type: Array
        },
        excludeLikeLabel: { // 排除名称包含关键字的数据项
          type: Array
        },
        disabled: false
    },
    data() {
        return {
            courseLabelList: [],
            loading: false
        };
    },
    mounted() {
        this.init();
    },
    created() {
      //将include与exclude的内容变成字符串
      if(this.include && this.include.length>0){
         this.include = this.include.map(item=>item+"");
      }
      if(this.exclude && this.exclude.length>0){
         this.exclude = this.exclude.map(item=>item+"");
      }
    },
    methods: {
        handleChange(val) {
            this.$emit("change", val);
            this.$emit("input", val);
        },
        init() {
            let queryParams = { condition: {label: "", isDelate: "0"}, pageNum_: 1, pageSize_: 1000 };
            let _this = this;
            getCoursesLabelList(queryParams).then(res =>{
              if (res.code === 200) {
                let list = res.data.list;
                if (list && list.length) {
                  let lang = _this.$store.getters.language;
                  let filterList = new Array();
                  // 对培养方案服务返回的课程性质列表做处理
                  list.forEach(item => {
                    let key = item.id;
                    let label = (lang === "cn") ? item.label : item.labelEn;
                    let flag = true;

                    // 如果exclude不为空，并且包含指定值则不可以显示
                    // 如果为空就默认处理
                    if (_this.exclude && _this.exclude.length > 0) {
                      // 如果exclude不为空，并且包含指定值则不可以加入到数据项中
                      if (_this.exclude.includes(key)) {
                        flag = false;
                      } else {
                        flag = true
                      }
                    }
                    // 如果excludeLabel不为空，并且包含指定值则不可以显示，不包含则可以显示
                    // 如果为空就默认处理
                    if (_this.excludeLabel && _this.excludeLabel.length > 0) {
                      if (_this.excludeLabel.includes(label)) {
                        flag = false;
                      } else {
                        flag = true;
                      }
                    }
                    // 如果include不为空，并且包含指定值则可以显示 不包含就不可以显示
                    // 如果为空就默认处理
                    if (_this.include && _this.include.length > 0) {
                      if (_this.include.includes(key)) {
                        flag = true;
                      } else {
                        flag = false;
                      }
                    }
                    // 如果excludeLabel不为空，并且包含指定值则不可以显示，不包含则可以显示
                    // 如果为空就默认处理
                    if (_this.excludeLikeLabel && _this.excludeLikeLabel.length > 0) {
                      let tempExcludes = _this.excludeLikeLabel.filter(tempItem => label.search(tempItem) != -1);
                      if (tempExcludes && tempExcludes.length) {
                        flag = false;
                      } else {
                        flag = true;
                      }
                    }
                    // 标识为true，则可以添加到数据项列表中显示
                    if (flag) {
                      _this.courseLabelList.push({
                          value: key,
                          label: label
                      });
                    }

                  });
                  _this.$emit("load-done", _this.courseLabelList);
                }
              }
            });
        }
    },
    watch: {
        model: {
            immediate: true,
            handler: function(newVal, oldVal) {
                if (typeof (newVal) == 'string' && newVal) {
                  let val = parseInt(newVal);
                  if (val) {
                    this.model = val;
                  }
                }
            }
        }
    }
};
</script>

<style scoped>
</style>
